package com.goat.view;

import com.goat.model.element.BaseElement;
import com.goat.model.manager.EleManager;
import com.goat.model.manager.enumCls.GameElement;

import javax.swing.*;
import java.awt.*;
import java.util.List;
import java.util.Map;

/**
 * 主要负责：元素显示   界面刷新
 *  paint方法默认执行一次，如果需要实现界面刷新，则需要多线程
 *  实现：
 *      实现Runnable接口，重写run方法，在run中一个循环里面repaint()
 */
public class MainJPanel extends JPanel implements Runnable{
    //联动管理器
    private EleManager eleManager;

    public MainJPanel(){
        init();
        //因为现在没有加载器，所以现在这里实现加载对象,过几天会写在别处
        //load();
    }
    public void init(){
        eleManager=EleManager.getEleManager();
    }

    //在model层的加载器中实现
    /*public void load(){
        //载入图片
        ImageIcon imageIcon=new ImageIcon("image/jj.png");
        //实例化对象，参数其实是读配置文件的
        BaseElement baseElement=new Player(100,100,50,50,imageIcon);
        //放入管理器
        eleManager.getGameElements().get(GameElement.PLAYER).add(baseElement);
    }*/


    /**
     *
     * @param g  the <code>Graphics</code> context in which to paint
     *
     *    该方法默认执行一次，如果需要实现界面刷新，则需要多线程
     */
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        //xx.showElement(g)  在这里画画的，因为只有在这里才能获取到画笔

        //先获取所有元素，遍历paint出他们
        //问题：paint方法按顺序画出元素，后画的覆盖先画的，这就涉及到了先后顺序问题
        Map<GameElement, List<BaseElement>> map = eleManager.getGameElements();
        //Set<GameElement> gameElements = map.keySet(); 不再用无序的set
        //用枚举本身提供的api获取有序集合
        GameElement[] gameElements = GameElement.values();
        for (GameElement gameElement :gameElements) {
            List<BaseElement> baseElements = map.get(gameElement);
            for (BaseElement baseElement :baseElements) {
                baseElement.showElement(g);
            }
        }

    }

    //重写这个方法后，new Thread((Runnable) jPanel).start();每个MainJPanel对象就是一个独立的线程
    @Override
    public void run() {
        while (true){
            repaint();//刷新，即重新执行paint方法
            try {
                Thread.sleep(10);//每隔50毫秒
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}
